%ifdef WIN32
	%define intercalar _intercalar
	%define reemplazar _reemplazar
	%define malloc _malloc
	%define free _free
	%define printf _printf
%endif

%macro bio_printintSAFE 1 ;el entero, que puede ser un registro o inmediato.
	; Respeta la integridad de todos los registros. La idea es poder usar esto para debug y no tener que preocuparse porque algo deje de funcionar al llamar a la macro
		pusha
		push %1
		push biomsg
		call printf
		add esp, 8
		popa
	%endmacro

global reemplazar
global intercalar

extern malloc
extern printf

section .text

bioRegMmx dd -1,0
biomsgLine db "---------------------------------------",10,0
biomsg db "El numero int es %d",10,0
biomsgHex db "El numero en hex es %08x",10,0
biomsgMmxHex db "El reg. mmx en hex es %08x%08x",10,0
msgError db 'ERROR: distinta longitud.',10,0	;27 bytes
%define array ebp+8


reemplazar:
	push ebp
	mov ebp, esp
	push ebx
	push edi
	push esi
	
	mov edi, [array]		;edi tendra el puntero al array
	cld						;clear direction flag

ciclo:
	mov al, [edi]
	cmp al, 0
	je _fin
	cmp al, 'A'
	je uno
	cmp al, '/'
	je dos
	cmp al, '*'
	je tres
	cmp al, ';'
	je cuatro
	cmp al, '{'
	je cinco
	cmp al, '}'
	je seis
	inc edi
	jmp ciclo

uno:
	mov al, 'a'
	jmp sigo
dos:
	mov al, '-'
	jmp sigo
tres:
	mov al, ':'
	jmp sigo
cuatro:
	mov al, ','
	jmp sigo
cinco:
	mov al, '('
	jmp sigo
seis:
	mov al, ')'

sigo:
	stosb
	jmp ciclo
	
_fin:
	mov eax, [array]
	pop esi
	pop edi
	pop ebx
	pop ebp
	ret ;ret
	
%define array1 ebp+8
%define array2 ebp+12

intercalar:
	push ebp
	mov ebp, esp
	push ebx
	push edi
	push esi
	
	xor ecx, ecx			;ecx == longc = 0
	mov esi, [array1]	;esi apunta al array1
long1:
	inc ecx
	lodsb					;mov al, [esi] y inc esi
	cmp al, 0
	jne long1
	sub ecx, 1

	xor ebx, ebx			;ebx == longd = 0
	mov esi, [array2]	;esi apunta al array2
long2:
	inc ebx
	lodsb					;mov al, [esi] y inc esi
	cmp al, 0
	jne long2
	sub ebx, 1


	cmp ecx, ebx
	jne _error
	
	;lea edi, [ecx*2+1]
	;push ecx
	;push ecx
	
	mov ebx, ecx
	push dword 1000
	call malloc
	add esp, 4
	mov ecx, ebx
	
	mov esi, [array1]			;esi apunta al array1
	mov ebx, [array2]			;ebx apunta al array2
	mov edi, eax			;edi apunta a res
	
 _intercalo:
	 mov dl, [ebx]
	 mov [edi], byte dl
	 cmp dl, 0
	 je _fin2
	 inc ebx
	 inc edi
	 mov dl, [esi]
	 ;bio_printintSAFE eax
	 mov [edi], byte dl
	 inc edi
	 inc esi
	 jmp _intercalo
	
	;mov [edi+5],byte 0
	; mov eax, edi
	; jmp _fin2

 _error:
	; push dword msgError
	; call printf
	; add esp, 4
	; xor eax, eax			;devuelvo 0

 _fin2:
	
	pop esi
	pop edi
	pop ebx
	pop ebp
	ret ;ret